// 购物车状态
import { findCartList, mergeLocalCart, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'

export default {
  namespaced: true,
  state: () => {
    return {
      list: [] // 购物车列表
    }
  },
  getters: {
    // 1. 头部cart使用
    // 计算有效商品列表 isEffective = true  filter
    effectiveList (state) {
      return state.list.filter(item => item.isEffective === true)
    },
    // 有效商品总数量 把effctiveList中的每一项的count叠加起来
    allCount (state, getters) {
      // const list = state.list.filter(item => item.isEffective === true)
      return getters.effectiveList.reduce((a, c) => a + c.count, 0)
    },
    // 总钱数  = 所有单项的钱数累加  单项的钱数 = 数量 * 单价
    allPrice (state, getters) {
      // const list = state.list.filter(item => item.isEffective === true)
      return getters.effectiveList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 2. 页面cart使用
    // 已选中列表 selected = true
    selectedList (state, getters) {
      return getters.effectiveList.filter(item => item.selected)
    },
    // 已选择列表总钱数  selectedList 中所有项的单价*数据进行叠加
    allSelectedPrice (state, getters) {
      return getters.selectedList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 全选：有效列表中的seleted字段全为true 才为true
    isAll (state, getters) {
      if (getters.effectiveList.length) {
        return getters.effectiveList.every(item => item.selected)
      } else {
        return false
      }
    }
  },
  mutations: {
    insertCart (state, goods) {
      const sameIndex = state.list.findIndex(item => item.skuId === goods.skuId)
      // 逻辑: 有相同的给goods累加数量
      if (sameIndex > -1) {
        state.list[sameIndex].count += goods.count
      } else {
        // 新增
        state.list.unshift(goods)
      }
    },
    // 删除购物车商品 根据唯一的skuId查找删除
    deleteCart (state, good) {
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(index, 1)
    },
    // 单选
    singleCheck (state, { good, selected }) {
      const curItem = state.list.find(item => item.skuId === good.skuId)
      curItem.selected = selected
    },
    // 全选
    allCheck (state, selected) {
      state.list.forEach(item => {
        item.selected = selected
      })
    },
    // 数量修改mutation
    changeCount (state, { good, count }) {
      const item = state.list.find(item => item.skuId === good.skuId)
      item.count = count
    },
    // 设置list的mutation
    setList (state, list) {
      state.list = list
    }
  },
  actions: {
    // common
    // 获取后台最新购物车列表数据
    async updateCartByApi (ctx) {
      // findCartList().then((res) => {
      //   ctx.commit('setList', res.result)
      // })
      const { result } = await findCartList()
      // 把成功返回的最新的购物车列表交给我们本地的state中的list
      ctx.commit('setList', result)
    },
    // 登陆前
    // 区分俩种状态
    // 加入购物车
    // 普通Promise写法1
    // asyncInsertCart (ctx, goods) {
    //   // eslint-disable-next-line no-async-promise-executor
    //   return new Promise(async (resolve, reject) => {
    //     if (ctx.rootState.user.profile.token) {
    //       // 已登录 TODO
    //       // 先执行加入购物车
    //       await insertCart(goods)
    //       // 再拉去最新购物车列表
    //       // const res = await findCartList()
    //       // ctx.commit('setList', res.result)
    //       ctx.dispatch('updateCartByApi')
    //       resolve()
    //     } else {
    //       // 未登录 把商品信息加入本地vuex中
    //       ctx.commit('insertCart', goods)
    //       resolve()
    //     }
    //   })
    // },
    // 是否登录
    isLogin (ctx) {
      return ctx.rootState.user.profile.token
    },
    // async异步函数返回Promise写法
    async asyncInsertCart (ctx, goods) {
      // console.log(222, await ctx.dispatch('isLogin'))
      if (await ctx.dispatch('isLogin')) {
        // 已登录 TODO
        // 先执行加入购物车
        await insertCart(goods)
        // 再拉去最新购物车列表
        // const res = await findCartList()
        // ctx.commit('setList', res.result)
        ctx.dispatch('updateCartByApi')
        console.log('登录直接存后台并同步本地')
        // return true
      } else {
        // 未登录 把商品信息加入本地vuex中
        ctx.commit('insertCart', goods)
        console.log('未登录先存本地')
        // return true
      }
    },
    // 删除购物车商品
    deleteCart (ctx, good) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 登录 TODO
          deleteCart([good.skuId]).then(() => {
            // findCartList().then((res) => {
            //   ctx.commit('setList', res.result)
            //   resolve()
            // })
            ctx.dispatch('updateCartByApi')
            resolve()
          })
        } else {
          // 本地
          ctx.commit('deleteCart', good)
          resolve()
        }
      })
    },
    // action
    // 单选
    singleCheck (ctx, { good, selected }) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // console.log('sss')

          // 已登录 TODO
          // 合并参数
          updateCart({ ...good, selected }).then(() => {
            // findCartList().then(data => {
            //   ctx.commit('setList', data.result)
            //   resolve()
            // })
            console.log('sss')
            ctx.dispatch('updateCartByApi')
            resolve()
          })
        } else {
          // 未登录 把商品信息加入本地vuex中
          ctx.commit('singleCheck', { good, selected })
          resolve()
        }
      })
    },
    allCheck (ctx, selected) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录 TODO
          const ids = ctx.getters.effectiveList.map(item => item.skuId)
          checkAllCart({ selected, ids }).then(() => {
            // findCartList().then(res => {
            //   ctx.commit('setList', res.result)
            //   resolve()
            // })
            ctx.dispatch('updateCartByApi')
            resolve()
          })
        } else {
          // 未登录
          ctx.commit('allCheck', selected)
          resolve()
        }
      })
    },
    // 修改数量action
    changeCount (ctx, { good, count }) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 登录 TODO
          updateCart({ ...good, count }).then(() => {
            // findCartList().then(data => {
            //   ctx.commit('setList', data.result)
            //   resolve()
            // })
            ctx.dispatch('updateCartByApi')
            resolve()
          })
        } else {
          // 本地
          ctx.commit('changeCount', { good, count })
          resolve()
        }
      })
    },
    // 登陆后
    // 合并本地购物车
    async mergeLocalCart (ctx) {
      // 本地购物车数据为零无需合并
      if (ctx.state.list.length) {
        // 存储token后调用合并API接口函数进行购物合并
        const cartList = ctx.state.list.map(({ skuId, selected, count }) => {
          return { skuId, selected, count }
        })
        await mergeLocalCart(cartList)
        // 合并成功后从后端获取最新购物车列表替换本地
      }
      // 立刻获取最新的购物车列表
      // findCartList().then((res) => {
      //   console.log('new cart:', res)
      //   // 1.把成功返回的最新的购物车列表交给我们本地的state中的list
      //   ctx.commit('setList', res.result)
      // })
      // 优化
      ctx.dispatch('updateCartByApi')
    }
  }
}
